###  Python 输入与输出
# Python两种输出值的方式: 表达式语句和 print() 函数。
# 第三种方式是使用文件对象的 write() 方法，标准输出文件可以用 sys.stdout 引用。
# 如果你希望输出的形式更加多样，可以使用 str.format() 函数来格式化输出值。
# 如果你希望将输出的值转成字符串，可以使用 repr() 或 str() 函数来实现。

# str()： 函数返回一个用户易读的表达形式。
# repr()： 产生一个解释器易读的表达形式

s = 'Hello Word!'
print(str(s))
print(repr(s))
print(str(1/7))
print(repr(1/7))


x = 3*1.589
y = 200*10

s = 'x 的值为：',repr(x),'y 的值为：',str(y)
s1 = 'x 的值为：'+repr(x)+', y 的值为：'+str(y)

print(s)
print(s1)


# 这里有两种方式输出一个平方与立方的表:

for i in range(1,11):
    print(repr(i).rjust(2),repr(i*i).rjust(3),end="")       # 字符串对象的 rjust() 方法, 它可以将字符串靠右, 并在左边填充空格
    print(repr(i*i*i).rjust(4))

print('')
# y = 1
# print(repr(y).rjust(10),repr(y).rjust(10),end='')
# print(y)

for a in range(1,11):
    print('{0:2d} {1:3d} {2:4d}'.format(a,a*a,a*a*a))


# str.format() 的基本使用如下:
print('{} 网址: {}'.format('baidu','www.baidu.com'))        # 括号及其里面的字符 (称作格式化字段) 将会被 format() 中的参数替换

print('')
#  在括号中的数字用于指向传入对象在 format() 中的位置，如下所示：
print('姓名{0} 年龄{1}'.format('name','18'),'\n')
print('姓名{1} 年龄{0}'.format('name','18'))

# 如果在 format() 中使用了关键字参数, 那么它们的值会指向使用该名字的参数
print('姓名{name} 年龄{age}'.format(name='Tom',age='18'))

# !a (使用 ascii()), !s (使用 str()) 和 !r (使用 repr()) 可以用于在格式化某个值之前对其进行转化:
from cgitb import text
from fileinput import filename
from lib2to3.pytree import type_repr
import math
# from os import killpg
from statistics import mode
from turtle import update

print('常量 PI 的值近似为： {}。'.format(math.pi))
print('常量 PI 的值近似为： {!r}。'.format(math.pi))
# 可选项 : 和格式标识符可以跟着字段名。 这就允许对值进行更好的格式化。 下面的例子将 Pi 保留到小数点后三位：
print('常量 PI 的值近似为： {0:.3f}。'.format(math.pi))
# 在 : 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用
newdict = {'Tom':18,'Job':20,'Nana':19}
for name,number in newdict.items():
    # print(name,number)
    print("{0:10} ==> {1:10d}".format(name,number))
# 如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会是很好的事情。
# 最简单的就是传入一个字典, 然后使用方括号 [] 来访问键值 :
table = {'Tom':18,'Job':20,'Nana':19}
print('Tom:{0[Tom]:d} ; Job:{0[Job]:d} ; Nana:{0[Nana]:d}'.format(table))

print('')

table = {'Tom':18,'Job':20,'Nana':19}

print('Tom:{Tom:d};Job:{Job:d};Nana:{Nana:d}'.format(**table))

# 旧式字符串格式化
# 因为 str.format() 是比较新的函数， 大多数的 Python 代码仍然使用 % 操作符。但是因为这种旧式的格式化最终会从该语言中移除, 应该更多的使用 str.format().
print('常量 PI 的值近似为：%5.3f。' % math.pi)


#### 读取键盘输入
# Python 提供了 input() 内置函数从标准输入读入一行文本，默认的标准输入是键盘。

# str = input('输入内容')
print('输入的内容是：',str)

print('')
#### 读和写文件
# open() 将会返回一个 file 对象，基本语法格式如下:
# open(filename,mode)

f = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test.text','w+')
f.write('Hello Word!')
# f.close()
# $ cat d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test.text
f.write('Python')
f.close()
# f = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test.text','r')
# f.write('python yyds')

### 文件对象的方法
# f.read()
# 为了读取一个文件的内容，调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
# size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
e = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test1.text','w+')
e.write('text1 中的文件')
e = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test1.text','r')
str = e.read()
print(str)

e.close()


#### f.readline()
# f.readline() 会从文件中读取单独的一行。换行符为 '\n'。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。

d = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test2.text','w+')
d.write('wo shi python\n')
d.write('wo shi di er hang\n')
d.write('wo shi di san hang')
d = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test2.text','r')

text1 = d.readline()
print('text2中的文件:',text1)
# f.readlines()
# f.readlines() 将返回该文件中包含的所有行。
# 如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割
x = d.readlines()
print('使用readlines方式读取的值:',x)

c = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test2.text','r')
text2 = c.readlines()
print('检验readlines方法,',text2)

# 另一种方式是迭代一个文件对象然后读取每行:
for file in text2:
    print('另一种方式',file,end='')

print('\n')
# f.write()
# f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。
t = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\test2.text','w')

nume = t.write('write')
print(nume)

py = open('d:\\Users\\Administrator\\Desktop\\python-demo\\python\\demo\\14.Python 输入和输出\\py.py','w')
py.write('# python shi zui hao de languth')


#### pickle 模块
# pickle模块实现了基本的数据序列和反序列化
import pickle

data = {                    # 使用 pickle 模块将数据对象保存到文件
    'a':[1,2.5,3,4+6j],
    'b':('string','str'),
    'c':None
}
print('data中: ',data,type(data))
selfref_list = [1,2,3]
selfref_list.append(selfref_list)

output = open('data.pkl','wb')

pickle.dump(data,output)

pickle.dump(selfref_list,output,-1)

output.close()

print('查看output中: ',output,type(output))

### 实例2
import pickle,pprint

pkl_file = open('data.pkl','rb')
data = pickle.load(pkl_file)
pprint.pprint(data)

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

pkl_file.close()